import pandas as pd
import numpy as np

# 时间序列
# 时间戳
print('\n1. 时间戳')
print(pd.Timestamp('2024-1-1'))  # 2024-01-01 00:00:00   时刻数据
print(pd.Period('2024-1-1', freq='s'))  # 2024-01-01   日期数据   freq可以置顶显示到年(Y)，月(M)，日(D),小时(h)，分钟(min)，秒(s)，小时等等

print("\n1.2. 批量生成时刻数据")
# 批量生成时刻数据
index = pd.date_range('2024-1-1', periods=5, freq='D')
print(index)

# 时间戳索引
print(pd.Series(np.random.randint(0, 10, size=5), index=index))
print("\n1.3.转换方法")
# 转换方法
index2 = pd.to_datetime(['2024.03.14', '2024.03.15', '2024.03.16'])  # 必须是统一格式的才能转换
print(index2)
# 时间戳-》时间
print(pd.to_datetime(1615776000, unit='s'))
print("\n1.4. 时间差")
# 时间差 DateOffset
print('\n时间差 DateOffset')  # 可以加，也可以减
print(pd.Timestamp('2024-1-1') + pd.DateOffset(years=1), "加一年")
print(pd.Timestamp('2024-1-1') + pd.DateOffset(months=1), "加一月")
print(pd.Timestamp('2024-1-1') + pd.DateOffset(days=1), "加一天")
print(pd.Timestamp('2024-1-1') + pd.DateOffset(hours=1), "加一小时")
print(pd.Timestamp('2024-1-1') + pd.DateOffset(minutes=1), "加一分钟")
print(pd.Timestamp('2024-1-1') + pd.DateOffset(seconds=1), "加一秒")
print(pd.Timestamp('2024-1-1') + pd.DateOffset(microseconds=1), "加一微秒")

print("\n1.5时间戳的索引和切片")
index3 = pd.date_range('2024-1-1', periods=15, freq='D')
print(index3)
ts = pd.Series(range(len(index3)), index=index3)
print(ts)
# 索引
print(ts['2024-01-01'])
print(ts['2024-01'])
print(ts['2024'])
# 切片
print(ts['2024-01-01':'2024-01-05'])

# 时间戳索引
print(pd.Timestamp('2024-1-1'))
print(ts[pd.Timestamp('2024-1-1')])

# 切片
print(ts[pd.Timestamp('2024-01-01'):pd.Timestamp('2024-01-05')])

# data_range
print(ts[pd.date_range('2024-01-01', periods=5, freq='D')])

# 属性
print('\n1.6. 属性')
print(ts.index)
print(ts.index.year)  # 年
print(ts.index.month)  # 月
print(ts.index.day)  # 日
print(ts.index.hour)  # 时
print(ts.index.minute)  # 分
print(ts.index.second)  # 秒
print(ts.index.weekday)  # 星期几

# 时间序列常用方法
print('\n2.. 时间序列常用方法')
# -- 对时间做一些移动/滞后，频率转换，采样等相关操作
index4 = pd.date_range('2024-1-1', periods=366, freq='D')
ts1 = pd.Series(np.random.randint(0, 500, len(index4)), index=index4)
print(ts1)
# 2.1 移动
print('\n2.1. 移动')
print(ts1.shift(1))  # 向后移动一位
print(ts1.shift(-1))  # 向前移动一位

print('\n2.2. 频率转换')
print(ts1.asfreq(pd.tseries.offsets.Week()))  # 转换为周频率
print(ts1.asfreq(pd.tseries.offsets.MonthEnd()))  # 转换为月末频率

# 又少变多：fill_value填充
print(ts1.asfreq(pd.tseries.offsets.Hour(), fill_value=0))  # 转换为小时频率，并填充0

# 3 采样
#  resample:根据日期维度进行数据聚合
# -- 按照分钟(T)，小时(H)，天(D)，周(w)，月(M),年(Y)，年等来作为日期维度
print('\n3. 重采样')
print(ts1.resample('2D').sum())  # 以2天为单位进行汇总，求和
print(ts1.resample('2ME').sum())  # 以2月为单位进行汇总，求和
print(ts1.resample('2W').sum())  # 以2周为单位进行汇总，求和
print(ts1.resample('3ME').sum().cumsum())  # 以3月为单位进行汇总，求和，累计求和
print(ts1.resample('h').sum())  # 以小时为单位进行汇总，求和
print(ts1.resample('min').sum())  # 以分钟为单位进行汇总，求和

# 4.DataFrame的重采样
print('\n4. DataFrame的重采样')
data = {
    'price': [10, 15, 21, 45, 9, 5, 66, 37],
    'score': [40, 50, 60, 70, 80, 90, 100, 110],
    'week': pd.date_range('2024-1-1', periods=8, freq='W'),
}
df = pd.DataFrame(data)
print(df)

# 对week列进行按月汇总求和
print(df.resample('ME', on='week').sum())

# a = df.resample('ME', on='week').agg({'price': np.mean,'score': np.sum})
# print(a)

# 5. 时区转换
print('\n5. 时区转换')
# tz：timezone  时区
import pytz
# 时区转换
index5 = pd.date_range('2024-1-1 00:00', periods=3, freq='D')
ts3= pd.Series(np.random.randn(len(index5)), index=index5)
print(ts3)

# 常用的时区：
print(pytz.common_timezones )

# 时区表达
ts3 = ts3.tz_localize(tz='UTC')  # 本地时区
print(ts3)

# 时区转换
ts3 = ts3.tz_convert(tz='Asia/Shanghai')  # 转换为上海时区
print(ts3)


